#include <iostream>
#include <memory>  //智能指针对应的头文件
using namespace std;

/*
	三种智能指针的区别
	   1.通过对象之间赋值来分析三者的区别
	   2.理论上分析：  
	        三种智能指针对象，理论上来说不能相互赋值(因为对象释放的时候会调用析构，析构会释放堆空间)
			同一个堆空间不可以释放多次
	   3.实际看到的情况
	        (1)auto_ptr对象之间可以赋值
			   策略：把赋值运算右边对象堆空间的所有权转让给左边对象，右边对象指向NULL
			(2)unique_ptr对象之间禁止赋值
	        (3)shared_ptr对象之间可以赋值，内部定义了int类型的变量统计指向同一个堆空间的对象数目
			               当对象赋值的时候，变量++
						   当对象地址空间释放的时候，变量--
						   当最后一个对象释放的时候，才调用delete去释放堆空间
*/

int main()
{
	shared_ptr<int> p1(new int);
	*p1=789;
	
	shared_ptr<int> p2;
	p2=p1; 
	cout<<"*p1 is: "<<*p1<<endl;
	cout<<"*p2 is: "<<*p2<<endl;
	
	shared_ptr<int> p3;
	p3=p2; 
	cout<<"*p1 is: "<<*p1<<endl;
	cout<<"*p2 is: "<<*p2<<endl;
	cout<<"*p3 is: "<<*p3<<endl;
	
	return 0;
}